{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 基础包导入与数据预览"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "\n",
    "# 基础绘图库\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "# %matplotlib inline\n",
    "# 各种细节配置如 文字大小，图例文字等杂项\n",
    "large = 22; med = 16; small = 12\n",
    "params = {'axes.titlesize': large,\n",
    "          'legend.fontsize': med,\n",
    "          'figure.figsize': (16, 10),\n",
    "          'axes.labelsize': med,\n",
    "          'axes.titlesize': med,\n",
    "          'xtick.labelsize': med,\n",
    "          'ytick.labelsize': med,\n",
    "          'figure.titlesize': large}\n",
    "plt.rcParams.update(params)\n",
    "plt.style.use('seaborn-whitegrid')\n",
    "sns.set_style(\"white\")\n",
    "plt.rc('font', **{'family': 'Microsoft YaHei, SimHei'})  # 设置中文字体的支持\n",
    "# sns.set(font='SimHei')  # 解决Seaborn中文显示问题，但会自动添加背景灰色网格\n",
    "\n",
    "plt.rcParams['axes.unicode_minus'] = False\n",
    "# 解决保存图像是负号'-'显示为方块的问题"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 52761 entries, 0 to 52760\n",
      "Data columns (total 3 columns):\n",
      "OrderNumber    52761 non-null object\n",
      "LineNumber     52761 non-null int64\n",
      "Model          52761 non-null object\n",
      "dtypes: int64(1), object(2)\n",
      "memory usage: 1.2+ MB\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>OrderNumber</th>\n",
       "      <th>LineNumber</th>\n",
       "      <th>Model</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>cumid51178</td>\n",
       "      <td>1</td>\n",
       "      <td>山地英骑</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>cumid51178</td>\n",
       "      <td>2</td>\n",
       "      <td>山地车水壶架</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>cumid51178</td>\n",
       "      <td>3</td>\n",
       "      <td>运动水壶</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>cumid51184</td>\n",
       "      <td>1</td>\n",
       "      <td>山地英骑</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>cumid51184</td>\n",
       "      <td>2</td>\n",
       "      <td>hl山地外胎</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  OrderNumber  LineNumber   Model\n",
       "0  cumid51178           1    山地英骑\n",
       "1  cumid51178           2  山地车水壶架\n",
       "2  cumid51178           3    运动水壶\n",
       "3  cumid51184           1    山地英骑\n",
       "4  cumid51184           2  hl山地外胎"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df = pd.read_csv('bike_data.csv', encoding='gbk')\n",
    "df.info(); df.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "数据参数\n",
    "- OrderNumber：客户昵称\n",
    "- LineNumber：购买顺序，如前三行分别表示同一个客户购买的三样商品的顺序\n",
    "- Model：商品名"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 探索性数据分析"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 检查重复值\n",
    "df.duplicated().sum()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "###### 商品种类及销量排名"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "数据集中共有37种商品\n",
      "商品名分别为：\n",
      "['山地英骑' '山地车水壶架' '运动水壶' 'hl山地外胎' '山地车内胎']\n",
      "['运动型头盔' '普通公路车' '公路车内胎' 'hl公路外胎' '竞速公路车']\n",
      "['公路车水壶架' '长袖骑车衣' '山地车挡泥板' '自行车帽' '山地车400']\n",
      "['ml山地外胎' '修补工具' '山地车500' '公路车550' '短袖经典车衣']\n",
      "['旅游型自行车(大)' '竞速袜' '半掌手套' '公路车350' 'ml公路外胎']\n",
      "['水壶包' '旅游型自行车(小)' '旅游型自行车(中)' '旅游车内胎' 'll公路车外胎']\n",
      "['旅游自行车外胎(通用)' '万能自行车座' '洗车喷剂' '经典背心' 'll山地胎']\n",
      "['故障栓钩' \"Women's Mountain Shorts\"]\n"
     ]
    }
   ],
   "source": [
    "# 商品种类探索\n",
    "print(f\"数据集中共有{df['Model'].nunique()}种商品\")\n",
    "\n",
    "model_names = df['Model'].unique()\n",
    "print(\"商品名分别为：\")\n",
    "# 5 个为一行显示\n",
    "for i in range(0, len(model_names), 5):\n",
    "      print(model_names[i:i+5])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Model</th>\n",
       "      <th>count</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Women's Mountain Shorts</td>\n",
       "      <td>958</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>hl公路外胎</td>\n",
       "      <td>804</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>hl山地外胎</td>\n",
       "      <td>1331</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>ll公路车外胎</td>\n",
       "      <td>980</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>ll山地胎</td>\n",
       "      <td>799</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                     Model  count\n",
       "0  Women's Mountain Shorts    958\n",
       "1                   hl公路外胎    804\n",
       "2                   hl山地外胎   1331\n",
       "3                  ll公路车外胎    980\n",
       "4                    ll山地胎    799"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 最畅销的 15 种商品\n",
    " ## 往 reset_index 中添加 name 参数可快速重命名列名\n",
    "grouped = df.groupby('Model')['Model'].count().reset_index(name='count')\n",
    "grouped.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "top_15 = grouped.sort_values(by='count', ascending=False).head(15)\n",
    "\n",
    "plt.figure(figsize=(8, 6))\n",
    "sns.barplot(data=top_15, x='count', y='Model')\n",
    "plt.grid(True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "初步分析，该自行车店的排名前15的畅销单品为如下：\n",
      "['运动型头盔', '运动水壶', '修补工具', '山地车内胎', '山地英骑']\n",
      "['公路车内胎', '自行车帽', '山地车挡泥板', '山地车水壶架', '公路车水壶架']\n",
      "['长袖骑车衣', '短袖经典车衣', '竞速公路车', '旅游车内胎', '半掌手套']\n"
     ]
    }
   ],
   "source": [
    "top_15 = top_15['Model'].tolist()\n",
    "print('初步分析，该自行车店的排名前15的畅销单品为如下：')\n",
    "for i in range(0, len(top_15), 5):\n",
    "    print(top_15[i:i+5])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 使用 Apriori 算法求解关联规则"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "import Apriori as apri"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "###### 1. 生成购物篮\n",
    "- 将同一个客户购买的所有商品放入同一个购物篮"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "\"\\narulesdata：数据集 -- DataFrame\\ntidvar: “分类的索引”，即划分购物篮的标准，本案例是根据客户 OrderNumber -- object类型\\nitemvar：将什么东西放进篮子里，本案例是将数据集中的商品，也就是 Model 列放入篮子 -- object类型\\ndata_type: 默认选择 'inverted'，库中提供的不变\\n\""
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 使用 Apriori 包中的 dataconvert 函数\n",
    "# 需要传入的参数，可以当作固定的来用\n",
    "\"\"\"\n",
    "arulesdata：数据集 -- DataFrame\n",
    "tidvar: “分类的索引”，即划分购物篮的标准，本案例是根据客户 OrderNumber -- object类型\n",
    "itemvar：将什么东西放进篮子里，本案例是将数据集中的商品，也就是 Model 列放入篮子 -- object类型\n",
    "data_type: 默认选择 'inverted'，库中提供的不变\n",
    "\"\"\"\n",
    "## 注意：需要注意传入的参数类型，只要对了，直接套用就不是什么难事"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "inverted index type dataSet\n"
     ]
    }
   ],
   "source": [
    "# 需要稍微等待一下\n",
    "baskets = apri.dataconvert(arulesdata=df, tidvar='OrderNumber', \n",
    "                           itemvar='Model', data_type='inverted')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(list, True)"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 返回的购物篮是一个大列表，大列表中的每一个小列表表示一个篮子\n",
    "# 购物篮个数刚好等于数据集中的客户数量\n",
    "type(baskets), len(baskets) == df['OrderNumber'].nunique()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[['普通公路车', '公路车水壶架'],\n",
       " ['运动型头盔', '旅游型自行车(中)'],\n",
       " ['山地英骑', '山地车水壶架', '运动水壶'],\n",
       " ['万能自行车座', '公路车内胎', 'hl公路外胎', '普通公路车'],\n",
       " ['普通公路车', '公路车水壶架', '运动水壶', '运动型头盔', '长袖骑车衣']]"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 预览前五个购物篮中的物品\n",
    "baskets[:5]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "21255"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(baskets)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "###### 2. 生成关联规则\n",
    "根据排列组合，可知这些交易将会产生 C 21255 2 即 21255×21254÷2 这么多个关联规则\n",
    "\n",
    "    首先就要满足支持度的要求，太小则直接被删去，支持度的大小可根据关联规则的多少调整\n",
    "    如果关联规则很少，可根据实际情况放宽支持度的要求\n",
    "\n",
    "参数说明:\n",
    " \n",
    "    + minSupport:最小支持度阈值\n",
    "    + minConf:最小置信度阈值\n",
    "    + minlen:规则最小长度\n",
    "    + maxlen:规则最大长度，一般2就够了\n",
    "\n",
    "这里，minSupport 或 minConf 设定越低，产生的规则越多，计算量也就越大\n",
    "\n",
    "<br>\n",
    "\n",
    "同样，规则的最小/最大长度这里可能也会令你迷惑，公路车=>公路车外胎，\n",
    "\n",
    "这条规则只涉及到用户的购买的物品；公路车=>公路车外胎=>修理工具”，\n",
    "\n",
    "这条规则就涉及到两个字段的信息，是两个维上的一条关联规则(长度为2)。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "frozenset({'ll山地胎'}) --> frozenset({'山地车内胎'}) conf: 0.560700876095119\n",
      "frozenset({'山地车内胎'}) --> frozenset({'ll山地胎'}) conf: 0.15405777166437415\n",
      "frozenset({'旅游自行车外胎(通用)'}) --> frozenset({'修补工具'}) conf: 0.24404086265607264\n",
      "frozenset({'修补工具'}) --> frozenset({'旅游车内胎'}) conf: 0.12026578073089701\n",
      "frozenset({'旅游车内胎'}) --> frozenset({'修补工具'}) conf: 0.25912670007158195\n",
      "frozenset({'ml公路外胎'}) --> frozenset({'修补工具'}) conf: 0.2898876404494382\n",
      "frozenset({'洗车喷剂'}) --> frozenset({'修补工具'}) conf: 0.3067129629629629\n",
      "frozenset({'ml山地外胎'}) --> frozenset({'修补工具'}) conf: 0.29547553093259465\n",
      "frozenset({'修补工具'}) --> frozenset({'ml山地外胎'}) conf: 0.106312292358804\n",
      "frozenset({'公路车350'}) --> frozenset({'运动型头盔'}) conf: 0.3358449946178687\n",
      "frozenset({'hl公路外胎'}) --> frozenset({'修补工具'}) conf: 0.2699004975124378\n",
      "frozenset({'半掌手套'}) --> frozenset({'运动水壶'}) conf: 0.23037417461482027\n",
      "frozenset({'长袖骑车衣'}) --> frozenset({'山地车挡泥板'}) conf: 0.14494518879415347\n",
      "frozenset({'山地车挡泥板'}) --> frozenset({'长袖骑车衣'}) conf: 0.11817279046673286\n",
      "frozenset({'自行车帽'}) --> frozenset({'长袖骑车衣'}) conf: 0.12219570405727923\n",
      "frozenset({'长袖骑车衣'}) --> frozenset({'自行车帽'}) conf: 0.1559074299634592\n",
      "frozenset({'山地车挡泥板'}) --> frozenset({'山地车内胎'}) conf: 0.14597815292949357\n",
      "frozenset({'山地车内胎'}) --> frozenset({'山地车挡泥板'}) conf: 0.10110041265474555\n",
      "frozenset({'ml山地外胎'}) --> frozenset({'运动型头盔'}) conf: 0.31209602954755306\n",
      "frozenset({'ll山地胎'}) --> frozenset({'修补工具'}) conf: 0.3579474342928661\n",
      "frozenset({'短袖经典车衣'}) --> frozenset({'运动水壶'}) conf: 0.2530904359141184\n",
      "frozenset({'旅游型自行车(小)'}) --> frozenset({'公路车水壶架'}) conf: 0.27171314741035857\n",
      "frozenset({'公路车水壶架'}) --> frozenset({'旅游型自行车(小)'}) conf: 0.20035252643948295\n",
      "frozenset({'旅游型自行车(小)'}) --> frozenset({'运动水壶'}) conf: 0.24621513944223108\n",
      "frozenset({'自行车帽'}) --> frozenset({'运动型头盔'}) conf: 0.2224343675417661\n",
      "frozenset({'修补工具'}) --> frozenset({'公路车内胎'}) conf: 0.18471760797342193\n",
      "frozenset({'公路车内胎'}) --> frozenset({'修补工具'}) conf: 0.2509025270758123\n",
      "frozenset({'ll公路车外胎'}) --> frozenset({'公路车内胎'}) conf: 0.5265306122448979\n",
      "frozenset({'公路车内胎'}) --> frozenset({'ll公路车外胎'}) conf: 0.23285198555956682\n",
      "frozenset({'ll公路车外胎'}) --> frozenset({'修补工具'}) conf: 0.3520408163265306\n",
      "frozenset({'修补工具'}) --> frozenset({'ll公路车外胎'}) conf: 0.11461794019933556\n",
      "frozenset({'水壶包'}) --> frozenset({'运动水壶'}) conf: 0.40084985835694054\n",
      "frozenset({'自行车帽'}) --> frozenset({'短袖经典车衣'}) conf: 0.1575178997613365\n",
      "frozenset({'短袖经典车衣'}) --> frozenset({'自行车帽'}) conf: 0.21470396877033182\n",
      "frozenset({'旅游自行车外胎(通用)'}) --> frozenset({'运动型头盔'}) conf: 0.26787741203178206\n",
      "frozenset({'旅游车内胎'}) --> frozenset({'运动型头盔'}) conf: 0.3235504652827488\n",
      "frozenset({'山地英骑'}) --> frozenset({'修补工具'}) conf: 0.13201453371013325\n",
      "frozenset({'修补工具'}) --> frozenset({'山地英骑'}) conf: 0.10863787375415283\n",
      "frozenset({'修补工具'}) --> frozenset({'hl山地外胎'}) conf: 0.12325581395348838\n",
      "frozenset({'hl山地外胎'}) --> frozenset({'修补工具'}) conf: 0.2787377911344854\n",
      "frozenset({'修补工具'}) --> frozenset({'山地车内胎'}) conf: 0.24485049833887046\n",
      "frozenset({'山地车内胎'}) --> frozenset({'修补工具'}) conf: 0.2534387895460798\n",
      "frozenset({'山地车水壶架'}) --> frozenset({'山地车挡泥板'}) conf: 0.19113858835651723\n",
      "frozenset({'山地车挡泥板'}) --> frozenset({'山地车水壶架'}) conf: 0.18421052631578946\n",
      "frozenset({'山地车挡泥板'}) --> frozenset({'运动水壶'}) conf: 0.15243296921549154\n",
      "frozenset({'ml公路外胎'}) --> frozenset({'运动型头盔'}) conf: 0.24831460674157305\n",
      "frozenset({'旅游型自行车(小)'}) --> frozenset({'运动型头盔'}) conf: 0.4374501992031873\n",
      "frozenset({'公路车550'}) --> frozenset({'运动型头盔'}) conf: 0.41045498547918685\n",
      "frozenset({'自行车帽'}) --> frozenset({'公路车水壶架'}) conf: 0.10596658711217184\n",
      "frozenset({'公路车水壶架'}) --> frozenset({'自行车帽'}) conf: 0.13043478260869565\n",
      "frozenset({'山地车水壶架'}) --> frozenset({'自行车帽'}) conf: 0.125193199381762\n",
      "frozenset({'自行车帽'}) --> frozenset({'山地车水壶架'}) conf: 0.11599045346062054\n",
      "frozenset({'运动水壶'}) --> frozenset({'自行车帽'}) conf: 0.1469578017664377\n",
      "frozenset({'自行车帽'}) --> frozenset({'运动水壶'}) conf: 0.2859188544152744\n",
      "frozenset({'公路车水壶架'}) --> frozenset({'竞速公路车'}) conf: 0.3284371327849589\n",
      "frozenset({'竞速公路车'}) --> frozenset({'公路车水壶架'}) conf: 0.38738738738738737\n",
      "frozenset({'竞速公路车'}) --> frozenset({'运动型头盔'}) conf: 0.2806652806652807\n",
      "frozenset({'运动水壶'}) --> frozenset({'竞速公路车'}) conf: 0.11898920510304219\n",
      "frozenset({'竞速公路车'}) --> frozenset({'运动水壶'}) conf: 0.33610533610533605\n",
      "frozenset({'ml山地外胎'}) --> frozenset({'山地车内胎'}) conf: 0.6712834718374884\n",
      "frozenset({'山地车内胎'}) --> frozenset({'ml山地外胎'}) conf: 0.25\n",
      "frozenset({'山地车挡泥板'}) --> frozenset({'运动型头盔'}) conf: 0.2701092353525323\n",
      "frozenset({'山地英骑'}) --> frozenset({'山地车挡泥板'}) conf: 0.2947113443681873\n",
      "frozenset({'山地车挡泥板'}) --> frozenset({'山地英骑'}) conf: 0.36246276067527305\n",
      "frozenset({'山地车水壶架'}) --> frozenset({'运动型头盔'}) conf: 0.2740855229263266\n",
      "frozenset({'公路车内胎'}) --> frozenset({'ml公路外胎'}) conf: 0.26173285198555957\n",
      "frozenset({'ml公路外胎'}) --> frozenset({'公路车内胎'}) conf: 0.651685393258427\n",
      "frozenset({'半掌手套'}) --> frozenset({'运动型头盔'}) conf: 0.4189288334556126\n",
      "frozenset({'ll公路车外胎'}) --> frozenset({'竞速公路车'}) conf: 0.34183673469387754\n",
      "frozenset({'竞速公路车'}) --> frozenset({'ll公路车外胎'}) conf: 0.23215523215523212\n",
      "frozenset({'旅游自行车外胎(通用)'}) --> frozenset({'旅游车内胎'}) conf: 0.8603859250851306\n",
      "frozenset({'旅游车内胎'}) --> frozenset({'旅游自行车外胎(通用)'}) conf: 0.5425912670007159\n",
      "frozenset({'山地英骑'}) --> frozenset({'运动型头盔'}) conf: 0.28663706096083974\n",
      "frozenset({'运动型头盔'}) --> frozenset({'山地英骑'}) conf: 0.11505428617728082\n",
      "frozenset({'hl山地外胎'}) --> frozenset({'运动型头盔'}) conf: 0.32306536438767847\n",
      "frozenset({'山地英骑'}) --> frozenset({'hl山地外胎'}) conf: 0.20185708518368994\n",
      "frozenset({'hl山地外胎'}) --> frozenset({'山地英骑'}) conf: 0.3756574004507889\n",
      "frozenset({'运动型头盔'}) --> frozenset({'山地车内胎'}) conf: 0.20093988008426508\n",
      "frozenset({'山地车内胎'}) --> frozenset({'运动型头盔'}) conf: 0.42640990371389276\n",
      "frozenset({'山地英骑'}) --> frozenset({'山地车内胎'}) conf: 0.13362939039160274\n",
      "frozenset({'山地车内胎'}) --> frozenset({'山地英骑'}) conf: 0.11382393397524072\n",
      "frozenset({'hl山地外胎'}) --> frozenset({'山地车内胎'}) conf: 0.6874530428249438\n",
      "frozenset({'山地车内胎'}) --> frozenset({'hl山地外胎'}) conf: 0.3146492434662999\n",
      "frozenset({'公路车内胎'}) --> frozenset({'运动型头盔'}) conf: 0.3677797833935018\n",
      "frozenset({'运动型头盔'}) --> frozenset({'公路车内胎'}) conf: 0.13206935666828715\n",
      "frozenset({'公路车水壶架'}) --> frozenset({'运动型头盔'}) conf: 0.2209165687426557\n",
      "frozenset({'运动水壶'}) --> frozenset({'公路车水壶架'}) conf: 0.3711972522080471\n",
      "frozenset({'公路车水壶架'}) --> frozenset({'运动水壶'}) conf: 0.8889541715628672\n",
      "frozenset({'运动水壶'}) --> frozenset({'运动型头盔'}) conf: 0.2590775269872424\n",
      "frozenset({'运动型头盔'}) --> frozenset({'运动水壶'}) conf: 0.1711229946524064\n",
      "frozenset({'长袖骑车衣'}) --> frozenset({'运动型头盔'}) conf: 0.28014616321559077\n",
      "frozenset({'长袖骑车衣'}) --> frozenset({'运动水壶'}) conf: 0.133373934226553\n",
      "frozenset({'公路车内胎'}) --> frozenset({'hl公路外胎'}) conf: 0.24909747292418774\n",
      "frozenset({'hl公路外胎'}) --> frozenset({'公路车内胎'}) conf: 0.6865671641791045\n",
      "frozenset({'山地车水壶架'}) --> frozenset({'山地英骑'}) conf: 0.3735188047398248\n",
      "frozenset({'山地英骑'}) --> frozenset({'山地车水壶架'}) conf: 0.2926927735163504\n",
      "frozenset({'运动水壶'}) --> frozenset({'山地英骑'}) conf: 0.14450441609421\n",
      "frozenset({'山地英骑'}) --> frozenset({'运动水壶'}) conf: 0.23778764634638677\n",
      "frozenset({'山地车水壶架'}) --> frozenset({'运动水壶'}) conf: 0.8361669242658424\n",
      "frozenset({'运动水壶'}) --> frozenset({'山地车水壶架'}) conf: 0.39818449460255156\n",
      "frozenset({'普通公路车'}) --> frozenset({'公路车水壶架'}) conf: 0.30169971671388107\n",
      "frozenset({'公路车水壶架'}) --> frozenset({'普通公路车'}) conf: 0.12514688601645124\n",
      "frozenset({'ml山地外胎'}) --> frozenset({'山地车内胎', '运动型头盔'}) conf: 0.3074792243767313\n",
      "frozenset({'山地车内胎'}) --> frozenset({'运动型头盔', 'ml山地外胎'}) conf: 0.11451169188445669\n",
      "frozenset({'旅游型自行车(小)'}) --> frozenset({'公路车水壶架', '运动水壶'}) conf: 0.24621513944223108\n",
      "frozenset({'公路车水壶架'}) --> frozenset({'旅游型自行车(小)', '运动水壶'}) conf: 0.18155111633372503\n",
      "frozenset({'旅游自行车外胎(通用)'}) --> frozenset({'运动型头盔', '旅游车内胎'}) conf: 0.26787741203178206\n",
      "frozenset({'旅游车内胎'}) --> frozenset({'运动型头盔', '旅游自行车外胎(通用)'}) conf: 0.16893342877594847\n",
      "frozenset({'hl山地外胎'}) --> frozenset({'山地车内胎', '修补工具'}) conf: 0.17129977460555976\n",
      "frozenset({'山地车水壶架'}) --> frozenset({'山地车挡泥板', '运动水壶'}) conf: 0.1581658938691396\n",
      "frozenset({'山地车挡泥板'}) --> frozenset({'运动水壶', '山地车水壶架'}) conf: 0.15243296921549154\n",
      "frozenset({'ml公路外胎'}) --> frozenset({'运动型头盔', '公路车内胎'}) conf: 0.24831460674157305\n",
      "frozenset({'自行车帽'}) --> frozenset({'公路车水壶架', '运动水壶'}) conf: 0.10596658711217184\n",
      "frozenset({'公路车水壶架'}) --> frozenset({'自行车帽', '运动水壶'}) conf: 0.13043478260869565\n",
      "frozenset({'山地车水壶架'}) --> frozenset({'自行车帽', '运动水壶'}) conf: 0.1179804224626481\n",
      "frozenset({'自行车帽'}) --> frozenset({'运动水壶', '山地车水壶架'}) conf: 0.10930787589498805\n",
      "frozenset({'公路车水壶架'}) --> frozenset({'竞速公路车', '运动水壶'}) conf: 0.28495887191539365\n",
      "frozenset({'运动水壶'}) --> frozenset({'竞速公路车', '公路车水壶架'}) conf: 0.11898920510304219\n",
      "frozenset({'竞速公路车'}) --> frozenset({'公路车水壶架', '运动水壶'}) conf: 0.33610533610533605\n",
      "frozenset({'山地车水壶架'}) --> frozenset({'运动型头盔', '运动水壶'}) conf: 0.22977846470891292\n",
      "frozenset({'运动水壶'}) --> frozenset({'运动型头盔', '山地车水壶架'}) conf: 0.10942100098135427\n",
      "frozenset({'山地车水壶架'}) --> frozenset({'运动型头盔', '山地英骑'}) conf: 0.11334363730036062\n",
      "frozenset({'山地英骑'}) --> frozenset({'山地车内胎', 'hl山地外胎'}) conf: 0.13362939039160274\n",
      "frozenset({'hl山地外胎'}) --> frozenset({'山地车内胎', '山地英骑'}) conf: 0.24868519909842227\n",
      "frozenset({'山地车内胎'}) --> frozenset({'hl山地外胎', '山地英骑'}) conf: 0.11382393397524072\n",
      "frozenset({'hl山地外胎'}) --> frozenset({'山地车内胎', '运动型头盔'}) conf: 0.2877535687453043\n",
      "frozenset({'山地车内胎'}) --> frozenset({'hl山地外胎', '运动型头盔'}) conf: 0.13170563961485557\n",
      "frozenset({'公路车水壶架'}) --> frozenset({'运动型头盔', '运动水壶'}) conf: 0.2209165687426557\n",
      "frozenset({'山地车水壶架'}) --> frozenset({'山地英骑', '运动水壶'}) conf: 0.30345182895414735\n",
      "frozenset({'运动水壶'}) --> frozenset({'山地英骑', '山地车水壶架'}) conf: 0.14450441609421\n",
      "frozenset({'山地英骑'}) --> frozenset({'运动水壶', '山地车水壶架'}) conf: 0.23778764634638677\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\97679\\Desktop\\2020.7.13 基于关联规则 Apriori 算法的智能推荐\\Apriori.py:135: FutureWarning: '.reindex_axis' is deprecated and will be removed in a future version. Use '.reindex' instead.\n",
      "  res=res.reindex_axis(['lhs','','rhs','support','confidence','lift'],axis=1)\n"
     ]
    }
   ],
   "source": [
    "# 最小支持度 minSupport 为什么设置得这么小？因为两个规则的其实很少\n",
    " ## minSupport 支持度如果在这个值以下的就不选入了\n",
    " ## minConf：min_confidence：置信度如果在这个值以下就不选入了\n",
    "result = apri.arules(dataset=baskets, minSupport=0.01, minConf=0.1,\n",
    "                  minlen=1, maxlen=2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "pandas.core.frame.DataFrame"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "type(result)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>lhs</th>\n",
       "      <th></th>\n",
       "      <th>rhs</th>\n",
       "      <th>support</th>\n",
       "      <th>confidence</th>\n",
       "      <th>lift</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>(ll山地胎)</td>\n",
       "      <td>==&gt;</td>\n",
       "      <td>(山地车内胎)</td>\n",
       "      <td>0.021077</td>\n",
       "      <td>0.560701</td>\n",
       "      <td>4.098245</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>(山地车内胎)</td>\n",
       "      <td>==&gt;</td>\n",
       "      <td>(ll山地胎)</td>\n",
       "      <td>0.021077</td>\n",
       "      <td>0.154058</td>\n",
       "      <td>4.098245</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>(旅游自行车外胎(通用))</td>\n",
       "      <td>==&gt;</td>\n",
       "      <td>(修补工具)</td>\n",
       "      <td>0.010115</td>\n",
       "      <td>0.244041</td>\n",
       "      <td>1.723285</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>(修补工具)</td>\n",
       "      <td>==&gt;</td>\n",
       "      <td>(旅游车内胎)</td>\n",
       "      <td>0.017031</td>\n",
       "      <td>0.120266</td>\n",
       "      <td>1.829813</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>(旅游车内胎)</td>\n",
       "      <td>==&gt;</td>\n",
       "      <td>(修补工具)</td>\n",
       "      <td>0.017031</td>\n",
       "      <td>0.259127</td>\n",
       "      <td>1.829813</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "             lhs           rhs   support  confidence      lift\n",
       "0        (ll山地胎)  ==>  (山地车内胎)  0.021077    0.560701  4.098245\n",
       "1        (山地车内胎)  ==>  (ll山地胎)  0.021077    0.154058  4.098245\n",
       "2  (旅游自行车外胎(通用))  ==>   (修补工具)  0.010115    0.244041  1.723285\n",
       "3         (修补工具)  ==>  (旅游车内胎)  0.017031    0.120266  1.829813\n",
       "4        (旅游车内胎)  ==>   (修补工具)  0.017031    0.259127  1.829813"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "result.head(5) # 会自动根据 支持度 和 置信度 的值计算出 提升度 lift"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "结果说明: 以 result 第一行为例 \n",
    "\n",
    "    + lhs: 被称为左手规则，通俗理解即用户购买的商品 - 山地车内胎\n",
    "    + rhs: 被称为右手规则，通俗理解即根据用户购买某商品来推荐的另一件商品 - ll山地胎\n",
    "    + support: 支持度，山地车内胎 和 ll山地胎 同时出现在一张购物小票中的概率\n",
    "    + confidence: 置信度，购买了 山地车内胎 的前提下，同时购买 ll山地胎 的概率\n",
    "    + lift：向购买了 山地车内胎 的客户推荐 ll山地胎 的话，这个客户购买 ll山地胎 的概率是这个客户自然而然购买 ll山地胎 的 400% 左右，即高了 300% 多，通俗理解：消费者平时较少单独购买桌角防撞海绵，可能偶尔想到的时候或自己小孩碰到的时候才会想起购买，如果我们在桌子(书桌饭桌)的成功下单页面添加桌角防撞海绵的推荐，则很大程度上可以提高防撞海绵的销量。这也符合我们在探索性数据分析中发现的前 15 名畅销商品后并希望通过畅销商品带动“相对非畅销商品”的宗旨。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 102 entries, 0 to 101\n",
      "Data columns (total 6 columns):\n",
      "lhs           102 non-null object\n",
      "              102 non-null object\n",
      "rhs           102 non-null object\n",
      "support       102 non-null float64\n",
      "confidence    102 non-null float64\n",
      "lift          102 non-null float64\n",
      "dtypes: float64(3), object(3)\n",
      "memory usage: 4.9+ KB\n"
     ]
    }
   ],
   "source": [
    "# 结果也不多，100 来个\n",
    "result.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "###### 3. 筛选互补品和互斥品"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 互补品\n",
    "# lift 提升度首先要大于1，然后再排序选择自己希望深究的前 n 个\n",
    "hubu = result[result['lift'] > 1].sort_values(by='lift', ascending=False).head(20)\n",
    "\n",
    "# 互斥品\n",
    "huchi = result[result['lift'] < 1].sort_values(by='lift', ascending=True).head(20)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>lhs</th>\n",
       "      <th></th>\n",
       "      <th>rhs</th>\n",
       "      <th>support</th>\n",
       "      <th>confidence</th>\n",
       "      <th>lift</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>71</th>\n",
       "      <td>(旅游车内胎)</td>\n",
       "      <td>==&gt;</td>\n",
       "      <td>(旅游自行车外胎(通用))</td>\n",
       "      <td>0.035662</td>\n",
       "      <td>0.542591</td>\n",
       "      <td>13.090553</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>70</th>\n",
       "      <td>(旅游自行车外胎(通用))</td>\n",
       "      <td>==&gt;</td>\n",
       "      <td>(旅游车内胎)</td>\n",
       "      <td>0.035662</td>\n",
       "      <td>0.860386</td>\n",
       "      <td>13.090553</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>92</th>\n",
       "      <td>(公路车内胎)</td>\n",
       "      <td>==&gt;</td>\n",
       "      <td>(hl公路外胎)</td>\n",
       "      <td>0.025970</td>\n",
       "      <td>0.249097</td>\n",
       "      <td>6.585282</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>93</th>\n",
       "      <td>(hl公路外胎)</td>\n",
       "      <td>==&gt;</td>\n",
       "      <td>(公路车内胎)</td>\n",
       "      <td>0.025970</td>\n",
       "      <td>0.686567</td>\n",
       "      <td>6.585282</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>65</th>\n",
       "      <td>(公路车内胎)</td>\n",
       "      <td>==&gt;</td>\n",
       "      <td>(ml公路外胎)</td>\n",
       "      <td>0.027288</td>\n",
       "      <td>0.261733</td>\n",
       "      <td>6.250710</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>66</th>\n",
       "      <td>(ml公路外胎)</td>\n",
       "      <td>==&gt;</td>\n",
       "      <td>(公路车内胎)</td>\n",
       "      <td>0.027288</td>\n",
       "      <td>0.651685</td>\n",
       "      <td>6.250710</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>28</th>\n",
       "      <td>(公路车内胎)</td>\n",
       "      <td>==&gt;</td>\n",
       "      <td>(ll公路车外胎)</td>\n",
       "      <td>0.024277</td>\n",
       "      <td>0.232852</td>\n",
       "      <td>5.050274</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>27</th>\n",
       "      <td>(ll公路车外胎)</td>\n",
       "      <td>==&gt;</td>\n",
       "      <td>(公路车内胎)</td>\n",
       "      <td>0.024277</td>\n",
       "      <td>0.526531</td>\n",
       "      <td>5.050274</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>69</th>\n",
       "      <td>(竞速公路车)</td>\n",
       "      <td>==&gt;</td>\n",
       "      <td>(ll公路车外胎)</td>\n",
       "      <td>0.015761</td>\n",
       "      <td>0.232155</td>\n",
       "      <td>5.035163</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>68</th>\n",
       "      <td>(ll公路车外胎)</td>\n",
       "      <td>==&gt;</td>\n",
       "      <td>(竞速公路车)</td>\n",
       "      <td>0.015761</td>\n",
       "      <td>0.341837</td>\n",
       "      <td>5.035163</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>82</th>\n",
       "      <td>(山地车内胎)</td>\n",
       "      <td>==&gt;</td>\n",
       "      <td>(hl山地外胎)</td>\n",
       "      <td>0.043049</td>\n",
       "      <td>0.314649</td>\n",
       "      <td>5.024695</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>81</th>\n",
       "      <td>(hl山地外胎)</td>\n",
       "      <td>==&gt;</td>\n",
       "      <td>(山地车内胎)</td>\n",
       "      <td>0.043049</td>\n",
       "      <td>0.687453</td>\n",
       "      <td>5.024695</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>60</th>\n",
       "      <td>(山地车内胎)</td>\n",
       "      <td>==&gt;</td>\n",
       "      <td>(ml山地外胎)</td>\n",
       "      <td>0.034204</td>\n",
       "      <td>0.250000</td>\n",
       "      <td>4.906510</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>59</th>\n",
       "      <td>(ml山地外胎)</td>\n",
       "      <td>==&gt;</td>\n",
       "      <td>(山地车内胎)</td>\n",
       "      <td>0.034204</td>\n",
       "      <td>0.671283</td>\n",
       "      <td>4.906510</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>55</th>\n",
       "      <td>(竞速公路车)</td>\n",
       "      <td>==&gt;</td>\n",
       "      <td>(公路车水壶架)</td>\n",
       "      <td>0.026300</td>\n",
       "      <td>0.387387</td>\n",
       "      <td>4.837790</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>54</th>\n",
       "      <td>(公路车水壶架)</td>\n",
       "      <td>==&gt;</td>\n",
       "      <td>(竞速公路车)</td>\n",
       "      <td>0.026300</td>\n",
       "      <td>0.328437</td>\n",
       "      <td>4.837790</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>87</th>\n",
       "      <td>(公路车水壶架)</td>\n",
       "      <td>==&gt;</td>\n",
       "      <td>(运动水壶)</td>\n",
       "      <td>0.071183</td>\n",
       "      <td>0.888954</td>\n",
       "      <td>4.635604</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>86</th>\n",
       "      <td>(运动水壶)</td>\n",
       "      <td>==&gt;</td>\n",
       "      <td>(公路车水壶架)</td>\n",
       "      <td>0.071183</td>\n",
       "      <td>0.371197</td>\n",
       "      <td>4.635604</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>98</th>\n",
       "      <td>(山地车水壶架)</td>\n",
       "      <td>==&gt;</td>\n",
       "      <td>(运动水壶)</td>\n",
       "      <td>0.076359</td>\n",
       "      <td>0.836167</td>\n",
       "      <td>4.360336</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>99</th>\n",
       "      <td>(运动水壶)</td>\n",
       "      <td>==&gt;</td>\n",
       "      <td>(山地车水壶架)</td>\n",
       "      <td>0.076359</td>\n",
       "      <td>0.398184</td>\n",
       "      <td>4.360336</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "              lhs                 rhs   support  confidence       lift\n",
       "71        (旅游车内胎)  ==>  (旅游自行车外胎(通用))  0.035662    0.542591  13.090553\n",
       "70  (旅游自行车外胎(通用))  ==>        (旅游车内胎)  0.035662    0.860386  13.090553\n",
       "92        (公路车内胎)  ==>       (hl公路外胎)  0.025970    0.249097   6.585282\n",
       "93       (hl公路外胎)  ==>        (公路车内胎)  0.025970    0.686567   6.585282\n",
       "65        (公路车内胎)  ==>       (ml公路外胎)  0.027288    0.261733   6.250710\n",
       "66       (ml公路外胎)  ==>        (公路车内胎)  0.027288    0.651685   6.250710\n",
       "28        (公路车内胎)  ==>      (ll公路车外胎)  0.024277    0.232852   5.050274\n",
       "27      (ll公路车外胎)  ==>        (公路车内胎)  0.024277    0.526531   5.050274\n",
       "69        (竞速公路车)  ==>      (ll公路车外胎)  0.015761    0.232155   5.035163\n",
       "68      (ll公路车外胎)  ==>        (竞速公路车)  0.015761    0.341837   5.035163\n",
       "82        (山地车内胎)  ==>       (hl山地外胎)  0.043049    0.314649   5.024695\n",
       "81       (hl山地外胎)  ==>        (山地车内胎)  0.043049    0.687453   5.024695\n",
       "60        (山地车内胎)  ==>       (ml山地外胎)  0.034204    0.250000   4.906510\n",
       "59       (ml山地外胎)  ==>        (山地车内胎)  0.034204    0.671283   4.906510\n",
       "55        (竞速公路车)  ==>       (公路车水壶架)  0.026300    0.387387   4.837790\n",
       "54       (公路车水壶架)  ==>        (竞速公路车)  0.026300    0.328437   4.837790\n",
       "87       (公路车水壶架)  ==>         (运动水壶)  0.071183    0.888954   4.635604\n",
       "86         (运动水壶)  ==>       (公路车水壶架)  0.071183    0.371197   4.635604\n",
       "98       (山地车水壶架)  ==>         (运动水壶)  0.076359    0.836167   4.360336\n",
       "99         (运动水壶)  ==>       (山地车水壶架)  0.076359    0.398184   4.360336"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "hubu # 结果也合情合理"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>lhs</th>\n",
       "      <th></th>\n",
       "      <th>rhs</th>\n",
       "      <th>support</th>\n",
       "      <th>confidence</th>\n",
       "      <th>lift</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>91</th>\n",
       "      <td>(长袖骑车衣)</td>\n",
       "      <td>==&gt;</td>\n",
       "      <td>(运动水壶)</td>\n",
       "      <td>0.010303</td>\n",
       "      <td>0.133374</td>\n",
       "      <td>0.695501</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>85</th>\n",
       "      <td>(公路车水壶架)</td>\n",
       "      <td>==&gt;</td>\n",
       "      <td>(运动型头盔)</td>\n",
       "      <td>0.017690</td>\n",
       "      <td>0.220917</td>\n",
       "      <td>0.760911</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>24</th>\n",
       "      <td>(自行车帽)</td>\n",
       "      <td>==&gt;</td>\n",
       "      <td>(运动型头盔)</td>\n",
       "      <td>0.021924</td>\n",
       "      <td>0.222434</td>\n",
       "      <td>0.766139</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>44</th>\n",
       "      <td>(山地车挡泥板)</td>\n",
       "      <td>==&gt;</td>\n",
       "      <td>(运动水壶)</td>\n",
       "      <td>0.014444</td>\n",
       "      <td>0.152433</td>\n",
       "      <td>0.794888</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>45</th>\n",
       "      <td>(ml公路外胎)</td>\n",
       "      <td>==&gt;</td>\n",
       "      <td>(运动型头盔)</td>\n",
       "      <td>0.010398</td>\n",
       "      <td>0.248315</td>\n",
       "      <td>0.855279</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>88</th>\n",
       "      <td>(运动水壶)</td>\n",
       "      <td>==&gt;</td>\n",
       "      <td>(运动型头盔)</td>\n",
       "      <td>0.049682</td>\n",
       "      <td>0.259078</td>\n",
       "      <td>0.892350</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>89</th>\n",
       "      <td>(运动型头盔)</td>\n",
       "      <td>==&gt;</td>\n",
       "      <td>(运动水壶)</td>\n",
       "      <td>0.049682</td>\n",
       "      <td>0.171123</td>\n",
       "      <td>0.892350</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>34</th>\n",
       "      <td>(旅游自行车外胎(通用))</td>\n",
       "      <td>==&gt;</td>\n",
       "      <td>(运动型头盔)</td>\n",
       "      <td>0.011103</td>\n",
       "      <td>0.267877</td>\n",
       "      <td>0.922660</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>61</th>\n",
       "      <td>(山地车挡泥板)</td>\n",
       "      <td>==&gt;</td>\n",
       "      <td>(运动型头盔)</td>\n",
       "      <td>0.025594</td>\n",
       "      <td>0.270109</td>\n",
       "      <td>0.930347</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>37</th>\n",
       "      <td>(修补工具)</td>\n",
       "      <td>==&gt;</td>\n",
       "      <td>(山地英骑)</td>\n",
       "      <td>0.015385</td>\n",
       "      <td>0.108638</td>\n",
       "      <td>0.932216</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>36</th>\n",
       "      <td>(山地英骑)</td>\n",
       "      <td>==&gt;</td>\n",
       "      <td>(修补工具)</td>\n",
       "      <td>0.015385</td>\n",
       "      <td>0.132015</td>\n",
       "      <td>0.932216</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>64</th>\n",
       "      <td>(山地车水壶架)</td>\n",
       "      <td>==&gt;</td>\n",
       "      <td>(运动型头盔)</td>\n",
       "      <td>0.025029</td>\n",
       "      <td>0.274086</td>\n",
       "      <td>0.944043</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>90</th>\n",
       "      <td>(长袖骑车衣)</td>\n",
       "      <td>==&gt;</td>\n",
       "      <td>(运动型头盔)</td>\n",
       "      <td>0.021642</td>\n",
       "      <td>0.280146</td>\n",
       "      <td>0.964918</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>56</th>\n",
       "      <td>(竞速公路车)</td>\n",
       "      <td>==&gt;</td>\n",
       "      <td>(运动型头盔)</td>\n",
       "      <td>0.019054</td>\n",
       "      <td>0.280665</td>\n",
       "      <td>0.966706</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>79</th>\n",
       "      <td>(山地英骑)</td>\n",
       "      <td>==&gt;</td>\n",
       "      <td>(山地车内胎)</td>\n",
       "      <td>0.015573</td>\n",
       "      <td>0.133629</td>\n",
       "      <td>0.976717</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>80</th>\n",
       "      <td>(山地车内胎)</td>\n",
       "      <td>==&gt;</td>\n",
       "      <td>(山地英骑)</td>\n",
       "      <td>0.015573</td>\n",
       "      <td>0.113824</td>\n",
       "      <td>0.976717</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>72</th>\n",
       "      <td>(山地英骑)</td>\n",
       "      <td>==&gt;</td>\n",
       "      <td>(运动型头盔)</td>\n",
       "      <td>0.033404</td>\n",
       "      <td>0.286637</td>\n",
       "      <td>0.987274</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>73</th>\n",
       "      <td>(运动型头盔)</td>\n",
       "      <td>==&gt;</td>\n",
       "      <td>(山地英骑)</td>\n",
       "      <td>0.033404</td>\n",
       "      <td>0.115054</td>\n",
       "      <td>0.987274</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "              lhs           rhs   support  confidence      lift\n",
       "91        (长袖骑车衣)  ==>   (运动水壶)  0.010303    0.133374  0.695501\n",
       "85       (公路车水壶架)  ==>  (运动型头盔)  0.017690    0.220917  0.760911\n",
       "24         (自行车帽)  ==>  (运动型头盔)  0.021924    0.222434  0.766139\n",
       "44       (山地车挡泥板)  ==>   (运动水壶)  0.014444    0.152433  0.794888\n",
       "45       (ml公路外胎)  ==>  (运动型头盔)  0.010398    0.248315  0.855279\n",
       "88         (运动水壶)  ==>  (运动型头盔)  0.049682    0.259078  0.892350\n",
       "89        (运动型头盔)  ==>   (运动水壶)  0.049682    0.171123  0.892350\n",
       "34  (旅游自行车外胎(通用))  ==>  (运动型头盔)  0.011103    0.267877  0.922660\n",
       "61       (山地车挡泥板)  ==>  (运动型头盔)  0.025594    0.270109  0.930347\n",
       "37         (修补工具)  ==>   (山地英骑)  0.015385    0.108638  0.932216\n",
       "36         (山地英骑)  ==>   (修补工具)  0.015385    0.132015  0.932216\n",
       "64       (山地车水壶架)  ==>  (运动型头盔)  0.025029    0.274086  0.944043\n",
       "90        (长袖骑车衣)  ==>  (运动型头盔)  0.021642    0.280146  0.964918\n",
       "56        (竞速公路车)  ==>  (运动型头盔)  0.019054    0.280665  0.966706\n",
       "79         (山地英骑)  ==>  (山地车内胎)  0.015573    0.133629  0.976717\n",
       "80        (山地车内胎)  ==>   (山地英骑)  0.015573    0.113824  0.976717\n",
       "72         (山地英骑)  ==>  (运动型头盔)  0.033404    0.286637  0.987274\n",
       "73        (运动型头盔)  ==>   (山地英骑)  0.033404    0.115054  0.987274"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "huchi "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 关联规则结果分析\n",
    "不要期望每个规则都有意义，要结合业务思考\n",
    "\n",
    "    比如竞速型赛道自行车与运动水壶互斥实属正常，竞速讲究轻量化，还配个水壶干什么...\n",
    "    比如山地车配一个竞速公路车用的运动型头盔...\n",
    "\n",
    "互斥产品则是成对出现的"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 根据关联规则结果推荐产品\n",
    "需要结合业务需求\n",
    "- 获得最大营销响应度？-- 看置信度，越高越好\n",
    "- 销售最大化？-- 看提升度，越高越好\n",
    "- 用户未产生消费，我们向其推荐商品？"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(frozenset({'山地车内胎'}), frozenset)"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 注意数据类型，frozenset，需要拆一下\n",
    "result['lhs'][1], type(result['lhs'][1])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 以获得最高的营销相应率为目标\n",
    "如果一个新客户刚刚下单了 山地车英骑 这个产品，\n",
    "\n",
    "如果希望获得最高的营销响应率，那在他付费成功页面上最应该推荐什么产品？\n",
    "- 目标：获得最高的营销响应率\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>lhs</th>\n",
       "      <th></th>\n",
       "      <th>rhs</th>\n",
       "      <th>support</th>\n",
       "      <th>confidence</th>\n",
       "      <th>lift</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>36</th>\n",
       "      <td>(山地英骑)</td>\n",
       "      <td>==&gt;</td>\n",
       "      <td>(修补工具)</td>\n",
       "      <td>0.015385</td>\n",
       "      <td>0.132015</td>\n",
       "      <td>0.932216</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75</th>\n",
       "      <td>(山地英骑)</td>\n",
       "      <td>==&gt;</td>\n",
       "      <td>(hl山地外胎)</td>\n",
       "      <td>0.023524</td>\n",
       "      <td>0.201857</td>\n",
       "      <td>3.223495</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>95</th>\n",
       "      <td>(山地英骑)</td>\n",
       "      <td>==&gt;</td>\n",
       "      <td>(山地车水壶架)</td>\n",
       "      <td>0.034110</td>\n",
       "      <td>0.292693</td>\n",
       "      <td>3.205144</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       lhs            rhs   support  confidence      lift\n",
       "36  (山地英骑)  ==>    (修补工具)  0.015385    0.132015  0.932216\n",
       "75  (山地英骑)  ==>  (hl山地外胎)  0.023524    0.201857  3.223495\n",
       "95  (山地英骑)  ==>  (山地车水壶架)  0.034110    0.292693  3.205144"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 使用的是左手规则：lhs(left hand rule)，lhs 表示的是购买的产品\n",
    " ## 使用 frozenset 来对字典的键进行选择\n",
    "purchase_good = result[result['lhs'] == frozenset({'山地英骑'})]\n",
    "purchase_good.sample(3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>lhs</th>\n",
       "      <th></th>\n",
       "      <th>rhs</th>\n",
       "      <th>support</th>\n",
       "      <th>confidence</th>\n",
       "      <th>lift</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>62</th>\n",
       "      <td>(山地英骑)</td>\n",
       "      <td>==&gt;</td>\n",
       "      <td>(山地车挡泥板)</td>\n",
       "      <td>0.034345</td>\n",
       "      <td>0.294711</td>\n",
       "      <td>3.110273</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>95</th>\n",
       "      <td>(山地英骑)</td>\n",
       "      <td>==&gt;</td>\n",
       "      <td>(山地车水壶架)</td>\n",
       "      <td>0.034110</td>\n",
       "      <td>0.292693</td>\n",
       "      <td>3.205144</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>72</th>\n",
       "      <td>(山地英骑)</td>\n",
       "      <td>==&gt;</td>\n",
       "      <td>(运动型头盔)</td>\n",
       "      <td>0.033404</td>\n",
       "      <td>0.286637</td>\n",
       "      <td>0.987274</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>97</th>\n",
       "      <td>(山地英骑)</td>\n",
       "      <td>==&gt;</td>\n",
       "      <td>(运动水壶)</td>\n",
       "      <td>0.027711</td>\n",
       "      <td>0.237788</td>\n",
       "      <td>1.239984</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75</th>\n",
       "      <td>(山地英骑)</td>\n",
       "      <td>==&gt;</td>\n",
       "      <td>(hl山地外胎)</td>\n",
       "      <td>0.023524</td>\n",
       "      <td>0.201857</td>\n",
       "      <td>3.223495</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>79</th>\n",
       "      <td>(山地英骑)</td>\n",
       "      <td>==&gt;</td>\n",
       "      <td>(山地车内胎)</td>\n",
       "      <td>0.015573</td>\n",
       "      <td>0.133629</td>\n",
       "      <td>0.976717</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>36</th>\n",
       "      <td>(山地英骑)</td>\n",
       "      <td>==&gt;</td>\n",
       "      <td>(修补工具)</td>\n",
       "      <td>0.015385</td>\n",
       "      <td>0.132015</td>\n",
       "      <td>0.932216</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       lhs            rhs   support  confidence      lift\n",
       "62  (山地英骑)  ==>  (山地车挡泥板)  0.034345    0.294711  3.110273\n",
       "95  (山地英骑)  ==>  (山地车水壶架)  0.034110    0.292693  3.205144\n",
       "72  (山地英骑)  ==>   (运动型头盔)  0.033404    0.286637  0.987274\n",
       "97  (山地英骑)  ==>    (运动水壶)  0.027711    0.237788  1.239984\n",
       "75  (山地英骑)  ==>  (hl山地外胎)  0.023524    0.201857  3.223495\n",
       "79  (山地英骑)  ==>   (山地车内胎)  0.015573    0.133629  0.976717\n",
       "36  (山地英骑)  ==>    (修补工具)  0.015385    0.132015  0.932216"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 根据置信度排序\n",
    "purchase_good.sort_values(by='confidence', ascending=False)\n",
    "# 根据下表，应该首先推荐山地车挡泥板"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 以最大化总体销售额为目标\n",
    "如果一个新客户刚下单了 山地英骑 这个产品，\n",
    "\n",
    "如果希望最大化提升总体的销售额，那么在他付费成功的页面上应该推荐什么产品？\n",
    "\n",
    "- 目标：最大化销售额"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>lhs</th>\n",
       "      <th></th>\n",
       "      <th>rhs</th>\n",
       "      <th>support</th>\n",
       "      <th>confidence</th>\n",
       "      <th>lift</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>75</th>\n",
       "      <td>(山地英骑)</td>\n",
       "      <td>==&gt;</td>\n",
       "      <td>(hl山地外胎)</td>\n",
       "      <td>0.023524</td>\n",
       "      <td>0.201857</td>\n",
       "      <td>3.223495</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>95</th>\n",
       "      <td>(山地英骑)</td>\n",
       "      <td>==&gt;</td>\n",
       "      <td>(山地车水壶架)</td>\n",
       "      <td>0.034110</td>\n",
       "      <td>0.292693</td>\n",
       "      <td>3.205144</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>62</th>\n",
       "      <td>(山地英骑)</td>\n",
       "      <td>==&gt;</td>\n",
       "      <td>(山地车挡泥板)</td>\n",
       "      <td>0.034345</td>\n",
       "      <td>0.294711</td>\n",
       "      <td>3.110273</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>97</th>\n",
       "      <td>(山地英骑)</td>\n",
       "      <td>==&gt;</td>\n",
       "      <td>(运动水壶)</td>\n",
       "      <td>0.027711</td>\n",
       "      <td>0.237788</td>\n",
       "      <td>1.239984</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>72</th>\n",
       "      <td>(山地英骑)</td>\n",
       "      <td>==&gt;</td>\n",
       "      <td>(运动型头盔)</td>\n",
       "      <td>0.033404</td>\n",
       "      <td>0.286637</td>\n",
       "      <td>0.987274</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>79</th>\n",
       "      <td>(山地英骑)</td>\n",
       "      <td>==&gt;</td>\n",
       "      <td>(山地车内胎)</td>\n",
       "      <td>0.015573</td>\n",
       "      <td>0.133629</td>\n",
       "      <td>0.976717</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>36</th>\n",
       "      <td>(山地英骑)</td>\n",
       "      <td>==&gt;</td>\n",
       "      <td>(修补工具)</td>\n",
       "      <td>0.015385</td>\n",
       "      <td>0.132015</td>\n",
       "      <td>0.932216</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       lhs            rhs   support  confidence      lift\n",
       "75  (山地英骑)  ==>  (hl山地外胎)  0.023524    0.201857  3.223495\n",
       "95  (山地英骑)  ==>  (山地车水壶架)  0.034110    0.292693  3.205144\n",
       "62  (山地英骑)  ==>  (山地车挡泥板)  0.034345    0.294711  3.110273\n",
       "97  (山地英骑)  ==>    (运动水壶)  0.027711    0.237788  1.239984\n",
       "72  (山地英骑)  ==>   (运动型头盔)  0.033404    0.286637  0.987274\n",
       "79  (山地英骑)  ==>   (山地车内胎)  0.015573    0.133629  0.976717\n",
       "36  (山地英骑)  ==>    (修补工具)  0.015385    0.132015  0.932216"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "purchase_good.sort_values(by='lift', ascending=False)\n",
    "# 由下表可知，应该首推 hl 山地车外胎"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "再次重申提升度通俗含义\n",
    "\n",
    "提升度是相对于自然而然购买而言，A对B的提升度为4.0的理解如下\n",
    "\n",
    "    向购买了A的用户推荐B，则该用户购买B的概率是该用户单独\n",
    "    （即自然而然的购买）购买B的概率的 400%\n",
    "    \n",
    "    向购买了A的用户推荐B，则该用户购买B的概率比该用户单独\n",
    "    （即自然而然的购买）购买B的概率 \\textbf{高} 300%"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 用户并未产生消费，我们为其推荐某样商品"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>lhs</th>\n",
       "      <th></th>\n",
       "      <th>rhs</th>\n",
       "      <th>support</th>\n",
       "      <th>confidence</th>\n",
       "      <th>lift</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>37</th>\n",
       "      <td>(修补工具)</td>\n",
       "      <td>==&gt;</td>\n",
       "      <td>(山地英骑)</td>\n",
       "      <td>0.015385</td>\n",
       "      <td>0.108638</td>\n",
       "      <td>0.932216</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>80</th>\n",
       "      <td>(山地车内胎)</td>\n",
       "      <td>==&gt;</td>\n",
       "      <td>(山地英骑)</td>\n",
       "      <td>0.015573</td>\n",
       "      <td>0.113824</td>\n",
       "      <td>0.976717</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>73</th>\n",
       "      <td>(运动型头盔)</td>\n",
       "      <td>==&gt;</td>\n",
       "      <td>(山地英骑)</td>\n",
       "      <td>0.033404</td>\n",
       "      <td>0.115054</td>\n",
       "      <td>0.987274</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>96</th>\n",
       "      <td>(运动水壶)</td>\n",
       "      <td>==&gt;</td>\n",
       "      <td>(山地英骑)</td>\n",
       "      <td>0.027711</td>\n",
       "      <td>0.144504</td>\n",
       "      <td>1.239984</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>63</th>\n",
       "      <td>(山地车挡泥板)</td>\n",
       "      <td>==&gt;</td>\n",
       "      <td>(山地英骑)</td>\n",
       "      <td>0.034345</td>\n",
       "      <td>0.362463</td>\n",
       "      <td>3.110273</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>94</th>\n",
       "      <td>(山地车水壶架)</td>\n",
       "      <td>==&gt;</td>\n",
       "      <td>(山地英骑)</td>\n",
       "      <td>0.034110</td>\n",
       "      <td>0.373519</td>\n",
       "      <td>3.205144</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>76</th>\n",
       "      <td>(hl山地外胎)</td>\n",
       "      <td>==&gt;</td>\n",
       "      <td>(山地英骑)</td>\n",
       "      <td>0.023524</td>\n",
       "      <td>0.375657</td>\n",
       "      <td>3.223495</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "         lhs          rhs   support  confidence      lift\n",
       "37    (修补工具)  ==>  (山地英骑)  0.015385    0.108638  0.932216\n",
       "80   (山地车内胎)  ==>  (山地英骑)  0.015573    0.113824  0.976717\n",
       "73   (运动型头盔)  ==>  (山地英骑)  0.033404    0.115054  0.987274\n",
       "96    (运动水壶)  ==>  (山地英骑)  0.027711    0.144504  1.239984\n",
       "63  (山地车挡泥板)  ==>  (山地英骑)  0.034345    0.362463  3.110273\n",
       "94  (山地车水壶架)  ==>  (山地英骑)  0.034110    0.373519  3.205144\n",
       "76  (hl山地外胎)  ==>  (山地英骑)  0.023524    0.375657  3.223495"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 如果希望推荐山地英骑自行车，应该如何制定营销策略？\n",
    " ## 这里应该选出右手规则，因为直接就是推荐的产品，\n",
    " ##没有产生消费，消费了的即买了的才使用左手规则\n",
    "purchase_good = result[result['rhs'] == frozenset({'山地英骑'})].sort_values('lift')\n",
    "\n",
    "# 根据置信度或提升度排序都可以，因为直接根据右手规则选出来的数据框中，\n",
    " ## confidence 和 lift 成正比例关系，你高我就高\n",
    "purchase_good\n",
    "# 所以山地英骑跟山地车水壶架，山地车挡泥板，hl山地外胎一起推荐比较好"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>confidence</th>\n",
       "      <th>lift</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>confidence</th>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>lift</th>\n",
       "      <td>1.0</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "            confidence  lift\n",
       "confidence         1.0   1.0\n",
       "lift               1.0   1.0"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 由相关性也可知两者关系\n",
    "purchase_good[['confidence', 'lift']].corr()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  },
  "latex_envs": {
   "LaTeX_envs_menu_present": true,
   "autoclose": false,
   "autocomplete": true,
   "bibliofile": "biblio.bib",
   "cite_by": "apalike",
   "current_citInitial": 1,
   "eqLabelWithNumbers": true,
   "eqNumInitial": 1,
   "hotkeys": {
    "equation": "Ctrl-E",
    "itemize": "Ctrl-I"
   },
   "labels_anchors": false,
   "latex_user_defs": false,
   "report_style_numbering": false,
   "user_envs_cfg": false
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  },
  "varInspector": {
   "cols": {
    "lenName": 16,
    "lenType": 16,
    "lenVar": 40
   },
   "kernels_config": {
    "python": {
     "delete_cmd_postfix": "",
     "delete_cmd_prefix": "del ",
     "library": "var_list.py",
     "varRefreshCmd": "print(var_dic_list())"
    },
    "r": {
     "delete_cmd_postfix": ") ",
     "delete_cmd_prefix": "rm(",
     "library": "var_list.r",
     "varRefreshCmd": "cat(var_dic_list()) "
    }
   },
   "types_to_exclude": [
    "module",
    "function",
    "builtin_function_or_method",
    "instance",
    "_Feature"
   ],
   "window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
